www.gusucode.com > VC++ Bresenham Line 课程资源 > VC++ Bresenham Line 课程资源/Bresenham画线算法/base.cpp
/*************************************************************** 用Bresenham画线算法绘制任意方向的直线 使用VC++6.0 编译成功 ****************************************************************/ #include "stdafx.h" #include "base.h" #include <math.h> //画线,右手坐标系(x向右,y向上),也适合左手坐标系 //起点:x0,y0 //终点:x1,y1 //画线颜色 color void Bresenham_Line(HDC hdc,int x0,int y0,int x1,int y1,long color) { int x,y,dx,dy,e; int i,temp; int change=0; //如果直线斜率<=1, change=0; 否则change=1 int Step_X=1,Step_Y=1; //取值为1 或 -1 ,表示迭代过程中 x坐标和y坐标变化的方向 dx=x1-x0, dy=y1-y0; if(dx<0) { dx=-dx; //dx始终为正 Step_X=-1;//改变x的迭代方向为负,即每次迭代x减1 } if(dy<0) { dy=-dy; //dy始终为正 Step_Y=-1; //改变y的迭代方向为负,即每次迭代y减1 } if(dy>dx){ //如果斜率>1 temp=dx; //交换dx和dy dx=dy; dy=temp; change=1; //设置斜率>1标志 } e=-dx, x=x0,y=y0; for(i=0;i<=dx;i++) { //画点 SetPixel(hdc,x,y,color); if(change) y=y+Step_Y; //如果斜率>1, 每次先递增(或递减)y,而后判断x的变化 else x=x+Step_X; //如果斜率<=1,每次先递增(或递减)x,而后判断y的变化 e=e+2*dy; if(e>=0) { if(change) x=x+Step_X; //x的值比上一点有变化 else y=y+Step_Y; //y的值比上一点有变化 e=e-2*dx; } } }